Windows10系统FileMapping跨进程共享需要权限 |
您所在的位置:网站首页 › windows 进程权限 › Windows10系统FileMapping跨进程共享需要权限 |
通过CreateFileMapping - OpenFileMapping - MapViewOfFile跨进程共享内存映射时需要注意,在CreateFileMapping创建文件映射时需要设置权限,同时,指定映射名称时需要加"Global\"前缀。 - 第一步:创建FileMapping 参数1:INVALID_HANDLE_VALUE创建的FileMapping不关联到具体文件,直接在内存创建文件映射,参数2:不能传递NULL,需要指定权限参数6:ShareName需要指定"Global\"前缀 const int DATA_SIZE = 8294400; SECURITY_ATTRIBUTES sa; SECURITY_DESCRIPTOR sd; InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sd, true, NULL, false); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = &sd; sa.bInheritHandle = false; FString name = TEXT("Global\\") + ShareName; m_hShareFile = ::CreateFileMapping(INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0, DATA_SIZE, *name);创建成功后通过资源监视器查看句柄 注意:在整个共享内存执行期间,CreateFileMapping创建的句柄不可以调用CloseHandle关闭 - 第二步:写进程调用OpenFileMapping和MapViewOfFile打开文件映射,写入数据 XmlRequestResult r = new XmlRequestResult(); IntPtr hFile = IntPtr.Zero; IntPtr hMap = IntPtr.Zero; int totalSize = 0; hFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, true, "Global\\" + uid); if (IntPtr.Zero == hFile) { r.Code = XmlRequestResult.ExceptionCode.invalid_param; r.Message = "OpenFileMapping failed"; } else { IntPtr pBuff = MapViewOfFile(hFile, FILE_MAP_WRITE, 0, 0, (uint)DATA_SIZE); if (IntPtr.Zero == pBuff) { r.Code = XmlRequestResult.ExceptionCode.invalid_param; r.Message = "MapViewOfFile failed"; } else { //...C#调用Marshal.Copy写入数据 UnmapViewOfFile(pBuff); } CloseHandle(hFile); }写入完成后及时调用UnmapViewOfFile和CloseHandle关闭文件映射 - 第三步:读进程调用OpenFileMapping和MapViewOfFile打开文件映射,读取数据 FString strData; //用于存储共享内存中的数据 BYTE *pdata = NULL;// 共享内存指针 FString name = TEXT("Global\\") + ShareName; HANDLE hMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, *name);// 先判断要打开的共享内存名称是否存在 if (NULL == hMap) { ErrorMessage = TEXT("OpenFileMapping failed"); } else { pdata = (BYTE*)::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (NULL == pdata) { ErrorMessage = TEXT("MapViewOfFile failed"); } else { //...C++调用memcpy读取数据 ::UnmapViewOfFile(pdata); } ::CloseHandle(hMap); }读取完成后及时调用UnmapViewOfFile和CloseHandle关闭文件映射 如果按照以上方法创建了FileMapping句柄,调用OpenFileMapping打开句柄还是失败,那么可能是调用CreateFileMapping创建句柄的进程权限不足。 目前测试来看,在ASP.NET服务页面调用CreateFileMapping创建的文件映射,本进程可以打开,其他进程是无法打开的。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |